iT邦幫忙

2026 iThome 鐵人賽

DAY 21
0
自我挑戰組

30 天養大一個開源專案:baodao-skill 從零開始系列 第 21 篇

【Day 21】寫這篇的今天剛好放假:6,499 bytes 的人事總處日曆,和一年一變的編碼

  • 分享至 

  • xImage
  •  

先講結論:taiwan-holidays 查行政院人事行政總處的「政府行政機關辦公日曆表」,data.gov.tw 資料集 14718,一年一個 CSV,免金鑰免登入。寫這篇的 2026-09-28 早上實測,今天(週一)就是放假日:孔子誕辰紀念日/教師節。查假日不用爬頁面,一個 6,499 bytes 的檔案講完整年。

一個 CSV 一年,但每個檔案的編碼不一定一樣

欄位很簡單:西元日期,星期,是否放假,備註(0=上班、2=放假;補班日是 0 加備註「補行上班」)。2026-09-28 實測 115 年檔:HTTP 200、6,499 bytes、UTF-8 含 BOM、366 列(365 天加標頭)。但 114 年的「更新版」是 Big5——開頭第一個位元組 0xa6 直接讓 UTF-8 decode 爆炸。file 兩個都回「CSV text」幫不上忙,可靠的做法是試 decode,炸了才 iconv -f big5 -t utf-8。另外全部是 CRLF,awk 比對最後一欄前記得 sub(/\r$/,"",$4),不然「補行上班」永遠比不中。

實測:115 年的帳,和已經廢除的補班

2026-09-28 實測,與 9/12 的記錄完全一致(這種資料就該這麼穩定):

指標 實測值
資料列 365
放假日總數 120
平日放假日 16
補行上班日 0

補班是零不是漏資料:官方自 114 年下半年起廢除「調整上班日補行上班」,115 年起原則上沒有補班日。今年剩下的放假日:10/9(週五,國慶 10/10 遇週六的補假)、10/26(週一,光復節 10/25 遇週日的補假)、12/25(行憲紀念日)。「補假」跟「補班」方向相反——一個是多放,一個是多上班,備註欄要看清楚。

114 年要用「更新版」,不然 9 月後全部答錯

官方在 114/10/20 更新過日曆,新增教師節、光復節、行憲紀念日放假與補假。舊版 CSV 會讓你 2025 年 9 月之後全部答成上班。更新版連結不同、編碼也不同(Big5),驗證方式:

curl -sm 30 'https://www.dgpa.gov.tw/FileConversion?filename=dgpa/files/202510/b84cb88a-803c-4621-a843-d637b2775615.csv&nfix=&name=114.csv' \
  | iconv -f big5 -t utf-8 > /tmp/cal114.csv
awk -F, 'NR>1{sub(/\r$/,"",$4)} ($1=="20250929"||$1=="20251024"||$1=="20251225")' /tmp/cal114.csv
# 預期三列都是 2(放假):9/29 補假、10/24 補假、12/25 行憲紀念日

2026-09-28 實測輸出與預期一致。

備援是 xlsx,粉紅底色才是放假

當年度 xlsx 月曆可以交叉驗證:放假日是粉紅底色儲存格(fill FFFF99FF,樣式 id 31/34/38),上班日無底色。解析時有個很台灣的細節:月份不能讀標題文字——十一月、十二月的「十」和「一」分在兩個儲存格,直接用橫帶位置推算(band×3+block+1)最穩。9/12 實測 365 天全部與 CSV 一致。

錯誤處理(寫進 SKILL 的規矩)

  • CSV 404 或缺年份:回資料集 14718 頁拿最新 FileConversion 連結;注意另有「Google 行事曆專用」變體,欄位不同。
  • 亂碼先試 decode 再決定 iconv;CRLF 去 \r 再比對備註。
  • 114 年 9 月後查成上班=用了舊版,換 1141020 更新版。
  • 這是行政機關日曆;學校、銀行、股市休市各自不同,股市要用 taiwan-stock 交易日反推,不混用。
  • 請假、排程截止這種重要判斷,提醒使用者回 dgpa.gov.tw 看原文。

第 21 天。放假這種事,官方給的是一個 6KB 的 CSV 和一張粉紅色的月曆——連「十一月」都要拆成兩個儲存格放。


上一篇
【Day 20】0.8.2:發票會讀錯號碼、停車場每天長大,然後我們把地雷寫成了制度
下一篇
【Day 22】一個 JSON 裝 144 間博物館:「故宮」搜出兩個答案,64 間不用錢
系列文
30 天養大一個開源專案:baodao-skill 從零開始 共 24 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言